ECS Execute コマンドをCloudWatch Logsに出力する
ECS Execute コマンドの実行結果をCloudWatch Logsに出力しようとして、結構ハマったので、確認すべきポイントを紹介します。
※ECS Execute コマンドを実行するクライアント側の設定については、触れません。
確認したこと
executeCommandConfiguration
がちゃんと設定されていること
- 公式ドキュメント引用
logging プロパティにより、ECS Exec のログ機能の動作が決まります: NONE: ログ記録はオフ状態です DEFAULT: ログは構成済みの awslogs ドライバーに送信されます (ドライバーが構成されていない場合、ログは保存されません) OVERRIDE:ログは、提供された Amazon CloudWatch Logs LogGroup、Amazon S3 バケット、またはその両方に送信されます。
ほとんどの場合は、下記の様にTaskDefinitionのlog送信先をCloudWatch Logsに設定されていると思うので、ここが原因の可能性は低いです。
"logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/aws/ecs/sample/php-fpm", "awslogs-region": "eu-central-1", "awslogs-stream-prefix": "ecs" } }
コンテナに script
と cat
がインストールされていること
起動しているコンテナイメージに、script
と cat
がインストールされていることを確認してください。
下記の様に、aws ecs execute-command
を実行後に、コンテナ内部でコマンドがインストールされていることを確認できます。
/var/www/html$ which script /usr/bin/script /var/www/html$ which cat /bin/cat
もし、インストールされていない場合は、Dockerfileに追記して、イメージを再度 build&push して最新のイメージに置き換えてください。
Amazon ECSのタスクロールにアクセス許可が設定されていること
タスクロールの方にCloudWatch Logsへのアクセス許可が設定されていることを確認してください。
タスク実行ロールにはCloudWatch Logsへのアクセス許可が設定されていることが多いですが、タスクロールには設定されていないことが多いです。
自分の場合は、こちらが原因でした。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:DescribeLogGroups" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:region:account-id:log-group:/aws/ecs/cloudwatch-log-group-name:*" } ] }
タスクを再起動してみる
色々設定してもうまくいかない場合は、タスクを再起動してみてください。
インストールしたコマンドや、タスクロールの設定が反映されていない可能性があります。
それでもうまくいかない方へ
下記のGitHubのREADMEのリンクから、CloudFormationのテンプレートをデプロイしてみてください。
ECS Exec コマンドの実行結果をCloudWatch Logsに出力するphp-fpmが起動するようになっています。
[GitHub] ecs-exec-cmd-logging-demo
まとめ
自分の場合は、別途デプロイしたリソースと比較して、タスクロールの権限が足りていないことが分かりました。
意外とハマると思うので、どなたかの参考になれば幸いです。